#ifndef IMAGEPROCESSINGALGORITHMBASE_H
#define IMAGEPROCESSINGALGORITHMBASE_H

#include <QObject>
#include <QImage>
#include <QString>
#include <QWidget>
#include <QVariantMap>

/**
 * @brief 图像处理算法接口ID定义
 * 使用此ID识别所有图像处理算法插件
 */
#define IMAGEPROCESSINGALGORITHMBASE_IID "CameraImageAcquisition.ImageProcessingAlgorithmBase/1.0"


/**
 * @brief 图形处理算法统一接口基类
 * 定义所有图像处理算法必须实现的核心接口，提供统一的图像处理流程。
 * 作为插件系统的基础接口，确保所有算法遵循相同的行为规范，便于插件管理系统加载和使用。
 * 子类需继承此类并实现具体的图像处理逻辑，确保算法模块的可扩展性和互换性。
 */
class ImageProcessingAlgorithmBase : public QObject
{
    Q_OBJECT
public:
    /**
     * @brief 构造函数
     * @param parent 父对象指针，用于Qt对象树管理
     */
    explicit ImageProcessingAlgorithmBase(QObject *parent = nullptr) : QObject(parent) {}
    
    /**
     * @brief 虚析构函数
     * 使用default关键字确保编译器生成适当的析构函数代码，支持多态删除
     * 作为接口基类，虚析构函数确保通过基类指针删除派生类对象时能正确调用派生类的析构函数
     */
    virtual ~ImageProcessingAlgorithmBase() = default;
    
    /**
     * @brief 设置输入图像
     * 在执行处理前必须调用此方法设置待处理的图像数据
     * @param imageId 图像唯一标识符，用于跟踪处理结果
     * @param input 输入图像数据（支持QImage格式，任意颜色空间）
     */
    virtual void setInputImage(const QString &imageId, const QImage &input) = 0;

    /**
     * @brief 获取当前处理的图像ID
     * 用于查询当前正在处理或上次处理的图像标识符
     * @return 当前图像ID，如果没有设置则可能返回空字符串
     */
    virtual QString currentImageId() const = 0;

    /**
     * @brief 执行图像处理
     * 调用此方法将使用当前设置的输入图像和参数执行图像处理
     * 处理结果将通过imageProcessed信号输出，不直接返回结果
     * 子类实现时应确保在处理完成后发出imageProcessed信号
     * @param parameters 处理参数字符串，每个参数之间使用,隔开
     */
    virtual void processImage(const QString& parameters = "") = 0;

    /**
     * @brief 获取算法名称
     * 返回算法的唯一名称，用于在UI和管理器中标识
     * @return 算法名称字符串
     */
    virtual QString algorithmName() const = 0;

    /**
     * @brief 初始化算法
     * 在算法被插件管理器加载后调用，用于执行初始化操作
     * 通常在此方法中创建参数配置界面并通过registerAlgorithmWidget信号注册
     */
    virtual void initialize() = 0;
    
    /**
     * @brief 获取算法处理参数
     * 用于保存和恢复算法参数配置
     * @return 包含处理参数的QVariantMap，键为参数名，值为参数值
     */
    virtual QVariantMap getProcessParameters() const = 0;
    
    /**
     * @brief 设置算法处理参数
     * 用于加载之前保存的参数配置
     * @param params 包含处理参数的QVariantMap，键为参数名，值为参数值
     */
    virtual void setProcessParameters(const QVariantMap &params) = 0;
    
    /**
     * @brief 恢复默认参数
     * 将算法的所有参数恢复到默认设置
     * 通常在更换处理图像时调用，确保新图像使用默认参数处理
     */
    virtual void resetToDefaultParameters() = 0;

signals:
    /**
     * @brief 图像处理完成信号
     * 算法处理完成后应发出此信号，将处理结果传递给插件管理器
     * @param imageId 图像唯一标识符，与输入图像对应
     * @param processedImage 处理后的图像数据
     * @param isPretreatment 是否是预处理
     */
    void imageProcessed(const QString &imageId, const QImage &processedImage, bool isPretreatment = false);

    /**
     * @brief 注册算法参数配置界面
     * 算法初始化时应发出此信号，将参数配置界面注册到UI系统
     * @param algorithmName 算法名称，用于标识
     * @param widget 参数设置widget指针，可为nullptr表示不需要参数设置
     * @param iconPath 算法图标路径，用于UI中显示算法图标
     */
    void registerAlgorithmWidget(const QString& algorithmName, QWidget* widget, const QString& iconPath);
};

/**
 * @brief 声明Qt元类型接口
 * 使ImageProcessingAlgorithmBase成为Qt插件系统可识别的接口类型
 * 必须与相应的Q_INTERFACES宏在实现类中配合使用
 */
Q_DECLARE_INTERFACE(ImageProcessingAlgorithmBase, IMAGEPROCESSINGALGORITHMBASE_IID)

#endif // IMAGEPROCESSINGALGORITHMBASE_H
